#pragma once
#include <functional>
#include <google/protobuf/descriptor.h>
#include <google/protobuf/service.h>
#include <memory>
#include <muduo/net/EventLoop.h>
#include <muduo/net/InetAddress.h>
#include <muduo/net/TcpConnection.h>
#include <muduo/net/TcpServer.h>
#include <unordered_map>

// 框架提供的发布 rpc 服务的网络对象类
class RpcProvider {
public:
  // 提供给外部使用，可以发布rpc的接口
  void NotifyService(google::protobuf::Service *service);
  // 开始执行，等待调用
  void Run();

private:
  std::unique_ptr<muduo::net::TcpServer> m_tcpserverPtr;
  muduo::net::EventLoop m_eventLoop;

  struct ServiceInfo {
    google::protobuf::Service *m_service;
    std::unordered_map<std::string, const google::protobuf::MethodDescriptor *>
        m_methodMap;
  };
  std::unordered_map<std::string, ServiceInfo> m_serviceMap;
  void OnConnection(const muduo::net::TcpConnectionPtr &);
  void OnMessage(const muduo::net::TcpConnectionPtr &, muduo::net::Buffer *,
                 muduo::Timestamp);
  void SendRpcResponse(const muduo::net::TcpConnectionPtr &,
                       google::protobuf::Message *);
}; // class RpcProvider